package edu.uoc.tds.pec4.vista;

import edu.uoc.tds.pec4.gestor.impl.GestorConexionImpl;
import edu.uoc.tds.pec4.gestor.impl.GestorMantenimientoImpl;
import edu.uoc.tds.pec4.gestor.impl.GestorEventoImpl;
import edu.uoc.tds.pec4.gestor.impl.GestorInformesImpl;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.*;
import javax.swing.*;
import java.rmi.registry.LocateRegistry;
import java.util.Locale;
import edu.uoc.tds.pec4.util.LanguageUtils;
import edu.uoc.tds.pec4.util.ExceptionUtils;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 * Clase para visualizar la pantalla de conexion al servidor
 * @author Pedro Bauzá Picó
 * @version 1.0
 */
public class SS4_Servidor extends JFrame {

    private static final long serialVersionUID = 1L;
    private static final String languageUrl = "edu/uoc/tds/pec4/i18n/messages";

    /*ELEMENTOS PANTALLA*/
    private JPanel jContentPane;
    private JButton botonArrancar;
    private JButton botonDetener;
    private JPanel panelInformacion1;
    private JLabel etiquetaPanel1;

    /*GESTORES*/
    private GestorEventoImpl remotoEventoImpl;
    private GestorInformesImpl remotoInformesImpl;
    private GestorConexionImpl remotoConexionImpl;
    private GestorMantenimientoImpl remotoMantenimientoImpl;

    public SS4_Servidor() {
        jContentPane = null;
        botonArrancar = null;
        botonDetener = null;
        panelInformacion1 = null;
        etiquetaPanel1 = null;
        initialize();
    }

    private void initialize() {
        setSize(487, 196);
        setLocation(new Point(320, 100));
        setResizable(false);
        String titulo = LanguageUtils.getMessage("Servidor.ventana.titulo");
        setTitle(titulo);
        setContentPane(getJContentPane());
        try {
            LocateRegistry.createRegistry(1099);
        } catch (RemoteException e) {
            ExceptionUtils.visualizarError(ExceptionUtils.Err_Puerto);
        }
    }

    private void conectarRemoto(boolean flag) {
        if (flag) {
            try {
                remotoEventoImpl = new GestorEventoImpl();
                remotoInformesImpl = new GestorInformesImpl();
                remotoConexionImpl = new GestorConexionImpl();
                remotoMantenimientoImpl = new GestorMantenimientoImpl();
                Naming.rebind("rmi://localhost/GestorEventoImpl", remotoEventoImpl);
                Naming.rebind("rmi://localhost/GestorInformesImpl", remotoInformesImpl);
                Naming.rebind("rmi://localhost/GestorMantenimientoImpl", remotoMantenimientoImpl);
                Naming.rebind("rmi://localhost/GestorConexionImpl", remotoConexionImpl);
                botonArrancar.setEnabled(false);
                botonDetener.setEnabled(true);
                etiquetaPanel1.setForeground(new Color(0, 0, 255));
                etiquetaPanel1.setText(LanguageUtils.getMessage("Servidor.mensaje.iniciado"));
            } catch (MalformedURLException e) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_MalformedURL);
            } catch (RemoteException e) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
            } catch (Exception e) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_Inesperado);
            }
        } else {
            try {
                remotoEventoImpl = null;
                remotoConexionImpl = null;
                remotoInformesImpl = null;
                remotoMantenimientoImpl = null;
                Naming.unbind("GestorEventoImpl");
                Naming.unbind("GestorConexionImpl");
                Naming.unbind("GestorInformesImpl");
                Naming.unbind("GestorMantenimientoImpl");
                botonArrancar.setEnabled(true);
                botonDetener.setEnabled(false);
                etiquetaPanel1.setForeground(new Color(255, 0, 0));
                etiquetaPanel1.setText(LanguageUtils.getMessage("Servidor.mensaje.pendiente"));
            } catch (NotBoundException e) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_NotBound);
            } catch (MalformedURLException e) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_MalformedURL);
            } catch (RemoteException e) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_Remote);
            } catch (Exception e) {
                ExceptionUtils.visualizarError(ExceptionUtils.ERR_Inesperado);
            }
        }
    }

    private JButton getBotonArrancar() {
        if (botonArrancar == null) {
            botonArrancar = new JButton();
            botonArrancar.setBounds(new Rectangle(27, 67, 202, 70));
            botonArrancar.setText(LanguageUtils.getMessage("Servidor.boton.inicio"));
            botonArrancar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent actionevent) {
                    conectarRemoto(true);
                }
            });
        }
        return botonArrancar;
    }

    private JButton getBotonDetener() {
        if (botonDetener == null) {
            botonDetener = new JButton();
            botonDetener.setBounds(new Rectangle(255, 69, 197, 66));
            botonDetener.setEnabled(false);
            botonDetener.setText(LanguageUtils.getMessage("Servidor.boton.detener"));
            botonDetener.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent actionevent) {
                    conectarRemoto(false);
                }
            });
        }
        return botonDetener;
    }

    private JPanel getPanelInformacion1() {
        if (panelInformacion1 == null) {
            GridBagConstraints gridbagconstraints = new GridBagConstraints();
            gridbagconstraints.gridx = 0;
            gridbagconstraints.gridy = 0;
            etiquetaPanel1 = new JLabel();
            etiquetaPanel1.setForeground(new Color(0, 0, 255));
            etiquetaPanel1.setDisplayedMnemonic(0);
            etiquetaPanel1.setForeground(new Color(255, 0, 0));
            etiquetaPanel1.setText(LanguageUtils.getMessage("Servidor.mensaje.pendiente"));
            panelInformacion1 = new JPanel();
            panelInformacion1.setLayout(new GridBagLayout());
            panelInformacion1.setBounds(new Rectangle(27, 15, 425, 40));
            panelInformacion1.add(etiquetaPanel1, gridbagconstraints);
        }
        return panelInformacion1;
    }

    public static void main(String args[]) {
        if (args.length == 0) {
            LanguageUtils.setDefaultLanguage(languageUrl);
        }
        if (args.length == 1) {
            Locale locale = new Locale(args[0]);
            LanguageUtils.setLanguage(languageUrl, locale);
        }
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                SS4_Servidor servidorpec3 = new SS4_Servidor();
                servidorpec3.setDefaultCloseOperation(3);
                servidorpec3.setVisible(true);
            }
        });
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.add(getBotonArrancar(), null);
            jContentPane.add(getBotonDetener(), null);
            jContentPane.add(getPanelInformacion1(), null);
        }
        return jContentPane;
    }

    public GestorConexionImpl getRemotoConexionImpl() {
        return remotoConexionImpl;
    }

    public void setRemotoConexionImpl(GestorConexionImpl remotoConexionImpl) {
        this.remotoConexionImpl = remotoConexionImpl;
    }

    public GestorEventoImpl getRemotoEventoImpl() {
        return remotoEventoImpl;
    }

    public void setRemotoEventoImpl(GestorEventoImpl remotoEventoImpl) {
        this.remotoEventoImpl = remotoEventoImpl;
    }

    public GestorMantenimientoImpl getRemotoMantenimientoImpl() {
        return remotoMantenimientoImpl;
    }

    public void setRemotoMantenimientoImpl(GestorMantenimientoImpl remotoMantenimientoImpl) {
        this.remotoMantenimientoImpl = remotoMantenimientoImpl;
    }

    public GestorInformesImpl getRemotoInformesImpl() {
        return remotoInformesImpl;
    }

    public void setRemotoInformesImpl(GestorInformesImpl remotoInformesImpl) {
        this.remotoInformesImpl = remotoInformesImpl;
    }


}
